<!DOCTYPE html><html class="appearance-auto" lang="zh-CN"><head><meta charset="UTF-8"><title>【Spring源码解析系列】 SpringMVC</title><meta name="description" content="用创业者心态做好每一件事情！"><meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, initial-scale=1"><!-- Google Analytics --><!-- End Google Analytics -->
<!-- Baidu Analytics --><!-- End Baidu Analytics --><link rel="icon" href="/blog/images/favicon.png"><link rel="stylesheet" href="/blog/style/common/bulma.css"><link rel="stylesheet" href="/blog/style/base.css"><link rel="stylesheet" href="/blog/style/common/helper.css"><script src="/blog/js/common.js"></script><link rel="stylesheet" href="/blog/style/post.css"><link rel="stylesheet" href="/blog/style/themes/highlight-theme-light.css"><script src="/blog/js/highlight.pack.js"></script><meta name="description" content="
本文主要讲述Spring中SpringMVC



SpringMVC 是 Spring 框架的一个模块，用于快速构建基于 MVC 设计模式的 Web 应用程序。它提供了一套完整的 MVC 解决方案，包括控制器、视图解析器、处理器映射器等组件。SpringMVC 的工作流程大致如下：1、用户发送请求到控制器。2、控制器根据请求的 URL 和参数，调用相应的处理器（也叫控制器方法）。3、处理器进行业务逻辑处理，并返回模型数据。4、控制器根据模型数据和视图名称，选择相应的视图来渲染页面。5、最后，控制器将渲染结果返回给用户。SpringMVC 的工作流程详细如下：1、DispatcherServlet是SpringMVC中前端控制器（front controller），负责接受request，并将reques.."><!-- hexo injector head_end start -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-math@4.0.0/dist/style.css">
<!-- hexo injector head_end end --><meta name="generator" content="Hexo 5.4.1"><link rel="alternate" href="/blog/atom.xml" title="janedler's blog" type="application/atom+xml">
</head><body class="is-flex is-flex-direction-column"><header class="header-widget is-flex-shrink-0 is-hidden-mobile"><div class="container is-fullhd is-flex is-justify-content-space-between is-align-items-center is-full-height"><section class="is-hidden-mobile is-flex-shrink-0"><h2><a href="/blog/">田园牧歌(*︶*)'s blog</a></h2></section><h3 class="is-hidden-mobile is-family-serif is-full-height is-flex is-align-items-center is-flex-shrink-0"><div class="is-full-height" id="postTopic"><p class="is-full-height is-flex-shrink-0 is-flex is-align-items-center is-justify-content-center">【Spring源码解析系列】 SpringMVC</p><p class="is-full-height is-flex-shrink-0 is-flex is-align-items-center is-justify-content-center">点击返回顶部</p></div></h3><aside class="is-flex-shrink-0"><h3 class="is-inline-block"><a href="/blog/">首页</a></h3><h3 class="is-inline-block"><a href="/blog/about">关于</a></h3><h3 class="is-inline-block"><a href="/blog/archives">归档</a></h3></aside></div></header><header class="is-flex header-widget is-flex-shrink-0 is-align-items-center is-justify-content-center is-hidden-tablet"><h3 class="is-inline-block"><a href="/blog/">首页</a></h3><h3 class="is-inline-block"><a href="/blog/about">关于</a></h3><h3 class="is-inline-block"><a href="/blog/archives">归档</a></h3></header><main><main class="container is-max-widescreen content section post-page pt-4 px-4"><div class="columns is-flex-desktop is-justify-content-center is-flex-direction-row-reverse"><div class="column is-3 is-hidden-mobile is-hidden"></div><div class="column is-9"><header class="my-4"><a href="/blog/tags/Java"><i class="tag post-item-tag">Java</i></a><a href="/blog/tags/Spring"><i class="tag post-item-tag">Spring</i></a></header><h1 class="mt-0 mb-1 is-family-serif" id="postTitle">【Spring源码解析系列】 SpringMVC</h1><time class="has-text-grey" datetime="2022-11-30T16:00:00.000Z">2022-12-01</time><article class="mt-2 post-content"><p><img src="https://janedler.oss-cn-beijing.aliyuncs.com/images/spring.png" alt="cover"></p>
<p>本文主要讲述Spring中SpringMVC</p>
<span id="more"></span>

<p><img src="https://janedler.oss-cn-beijing.aliyuncs.com/images/image-20221211153505309.png" alt="image-20221211153505309"></p>
<p>SpringMVC 是 Spring 框架的一个模块，用于快速构建基于 MVC 设计模式的 Web 应用程序。它提供了一套完整的 MVC 解决方案，包括控制器、视图解析器、处理器映射器等组件。<br>SpringMVC 的工作流程大致如下：<br>1、用户发送请求到控制器。<br>2、控制器根据请求的 URL 和参数，调用相应的处理器（也叫控制器方法）。<br>3、处理器进行业务逻辑处理，并返回模型数据。<br>4、控制器根据模型数据和视图名称，选择相应的视图来渲染页面。<br>5、最后，控制器将渲染结果返回给用户。<br>SpringMVC 的工作流程详细如下：<br>1、DispatcherServlet是SpringMVC中前端控制器（front controller），负责接受request，并将request转发给对应的处理组件。<br>2、HandlerMapping是SpringMVC中完成URL到Controller映射的组件，DispatcherServlet接收request，然后从HnadlerMapping查找处理request的controller。<br>3、Controller处理request，并返回ModelAndView对象，Controller是SpringMVC中负责处理request的组件，ModelAndView是封装结果视图的组件。<br>4、5、6、视图解析器解析ModelAndView对象并返回对应的视图给客户端。</p>
<p>SpringMVC工作机制<br>        在容器初始化时会建立所有url和controller的对应关系，保存到Map&lt;url,controller&gt;中，tomcat启动时会通知spring初始化容器（加载bean的定义信息和初始化所有单例bean），然后springmvc会遍历容器中的bean，获取每一个controller中的所有方法访问的url，然后将url和controller保存到一个Map中。<br>        这样就可以根据request快速定位到controller，因为最终处理request的是controller中的方法，Map中只保留了url和controller中的对应关系，所以根据request的url进一步确认controller中的method，这一步工作的原理就是拼接controller的url（controller上@RequestMapping的值）和方法的url（method上@RequestMapping的值），与request的url进行匹配，找到匹配的那个方法。<br>        确定处理请求的method后，接下来的任务就是参数绑定，把request中参数绑定到方法的形式参数上，这一步是整个处理过程中最复杂的一个步骤。SpringMVC提供了两种request参数与方法形参的绑定方法：<br>        ①、通过注解进行绑定@RequestParam<br>        ②、通过参数名称进行绑定<br>        使用注解进行绑定，我们只要再方法参数前面声明@RequestParam(“a”)，就可以将request中参数a的值绑定到方法的该参数上，使用参数名称进行绑定的前提是必须要获取方法中参数的名称，Java反射只提供了获取方法的参数的类型，并没有提供获取参数名称的方法，SpringMVC解决这个问题的方法是用ASM框架读取字节码文件，来获取方法的参数名称。</p>
</article><section class="jump-container is-flex is-justify-content-space-between my-6"><!-- em is empty placeholder--><a class="button is-default" href="/blog/2022/12/01/Spring/Spring-BeanDefinition/" title="【Spring源码解析系列】 BeanDefinition"><i class="iconfont icon-prev mr-2 has-text-grey"></i><span class="has-text-weight-semibold">上一页: 【Spring源码解析系列】 BeanDefinition</span></a><a class="button is-default" href="/blog/2022/12/01/Spring/Spring-Bean%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/" title="【Spring源码解析系列】 Bean生命周期"><span class="has-text-weight-semibold">下一页: 【Spring源码解析系列】 Bean生命周期</span><i class="iconfont icon-next ml-2 has-text-grey"></i></a></section><article class="mt-6 comment-container"><script async repo="janedler/blog" src="https://utteranc.es/client.js" issue-term="pathname" theme="preferred-color-scheme"></script></article></div></div></main></main><footer class="is-flex is-flex-direction-column is-align-items-center is-flex-shrink-0 is-family-serif"><section class="sns-container"><!-- Github--><a title="github" target="_blank" rel="noopener nofollow" href="//github.com//janedler"><i class="iconfont icon-github"></i></a><!-- Ins--><!-- RSS--><a title="rss" target="_blank" rel="noopener nofollow" href="/blog/atom.xml"><i class="iconfont icon-rss"></i></a><!-- 知乎--><!-- 领英--><!-- 脸书--></section><p><span>Copyright ©</span><span> 田园牧歌(*︶*) 2022</span></p><div class="is-flex is-justify-content-center is-flex-wrap-wrap"><p>Powered by Hexo &verbar;&nbsp;</p><p class="is-flex is-justify-content-center"><a title="Hexo theme author" target="_blank" rel="noopener" href="//github.com/haojen">Theme by Haojen&nbsp;</a></p><div style="margin-top: 2px"><a class="github-button" title="github-button" target="_blank" rel="noopener" href="https://github.com/haojen/hexo-theme-Claudia" data-color-scheme="no-preference: light; light: light; dark: dark;" data-show-count="true"></a></div></div><div><span></span></div></footer><script async defer src="https://buttons.github.io/buttons.js"></script><script src="/blog/js/post.js"></script></body></html>